home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 2004 #11
/
Amiga Plus CD - 2004 - No. 11.iso
/
AmiSoft
/
Comm
/
mail
/
SpamFryer.lha
/
SpamFryer
/
YAM Support
/
rexx
/
SpamFryer.yam
< prev
Wrap
Text File
|
2004-07-18
|
14KB
|
383 lines
/*
*
* Usage: Rx SpamFryer.yam [<foldername>] [UNREAD] [ALL] [SILENT] [QUIET]
* Checks through emails in a folder and moves the unwanted ones.
*
* $VER: SpamFryer.yam 3.00 (18.07.04) by Allan Rasmussen
* Based upon SpamFryer.rexx by Simon N Goodwin
*
* Allan Rasmussen <allan (dot) tnt (at) post (dot) tele (dot) dk>
* Simon N Goodwin <amiga (at) studio (dot) co (dot) uk>
*
*/
/******************************* CONFIGURATION BLOCK ********************************/
/* */
/* Look for the Embed Rules further down in the script */
spamFolder = 'Deleted' /* The folder to move spam mail to */
keepList = 'YAM:SpamFryer.keeplist' /* The path and name of your keep list */
loseList = 'YAM:SpamFryer.loselist' /* The path and name of your kill list */
refresh = 'NO' /* Update folder index? 'YES' or 'NO' */
noDigits = 'NO' /* Fry mails with digits in the To: address? */
/**************************** END OF CONFIGURATION BLOCK ****************************/
OPTIONS RESULTS
OPTIONS FAILAT 10
PARSE ARG instring
IF instring = '?' THEN DO
SAY 'Usage: Rx SpamFryer.yam [<foldername>] [UNREAD] [ALL] [SILENT] [QUIET]'
EXIT 0
END
rcn = 0
keep = 1
lose = 2
gTo = 1
gFrom = 2
gReply = 3
gSubject = 4
gEarly = 5
list.keep = keepList
list.lose = loseList
listfield. = 0
listpattern. = ''
IF UPPER(LEFT(noDigits,1)) = 'Y' THEN noDigits = 1
ELSE noDigits = 0
IF ~SHOW('Ports','YAM') THEN SAY 'Please start YAM first.'
ELSE DO
ADDRESS YAM
OPTIONS FAILAT 11
'FOLDERINFO STEM folder. 'spamFolder''
rcn = rc
OPTIONS FAILAT 10
IF rcn ~= 0 THEN moan = 'Could not get information for ' || spamFolder || '. Folder not found.'
ELSE DO
spamFolder = folder.name
verbose = 1
silent = 0
checkAll = 0
checkUnread = 0
IF instring = '' THEN args = 0
ELSE DO /* extract and sort arguments - first extract... */
arg. = ''
args = 1
IF POS('"',instring)=0 THEN DO /* if the argument line does not contain quotation signs... */
PARSE VAR instring arg.1 arg.2 arg.3 arg.4 arg.5 arg.6 . /* the last variable is a dummy for validating the arguments */
DO WHILE arg.args ~= '' /* count arguments */
args = args + 1
END
args = args - 1
IF LEFT(arg.args,1) >= '0' & LEFT(arg.args,1) <= '9' THEN args = args - 1 /* to compensate for strange behaviour by YAM */
END
ELSE DO /* if the argument line contains quotation signs... */
PARSE VAR instring word1 '"' . /* extract arguments in front of "folder name" */
IF word1 ~= '' THEN DO
PARSE VAR word1 arg.1 arg.2 arg.3 arg.4 arg.5 . /* the last variable is a dummy for validating the arguments */
DO UNTIL arg.args = '' /* count arguments in front of "folder name" */
args = args + 1
END
END
PARSE VAR instring '"'word1'"' word2 /* word1 is the words embrased by quotation signs - word2 contains all arguments after that */
DO WHILE word2 ~= '' /* extract and count arguments after "folder name" */
PARSE VAR word2 arg.args word2
args = args + 1
END
t = args - 1
IF LEFT(arg.t,1) >= '0' & LEFT(arg.t,1) <= '9' THEN args = args - 1 /* to compensate for strange behaviour by YAM */
arg.args = word1 /* add the words embraced by quotation signs to the list of arguments */
END
IF args < 6 THEN DO /* too many arguments breaks the script with an error message - else finally sort and act upon them... */
i = 1
DO WHILE UPPER(arg.i) ~= 'QUIET' & i < args
i = i + 1
END
IF UPPER(arg.i) = 'QUIET' THEN DO
args = args - 1
DO i = i TO args
t = i + 1
arg.i = arg.t
END
verbose = 0
END
i = 1
DO WHILE UPPER(arg.i) ~= 'SILENT' & i < args
i = i + 1
END
IF UPPER(arg.i) = 'SILENT' THEN DO
args = args - 1
DO i = i TO args
t = i + 1
arg.i = arg.t
END
silent = 1
END
i = 1
DO WHILE UPPER(arg.i) ~= 'ALL' & i < args
i = i + 1
END
IF UPPER(arg.i) = 'ALL' THEN DO
args = args - 1
DO i = i TO args
t = i + 1
arg.i = arg.t
END
checkAll = 1
END
i = 1
DO WHILE UPPER(arg.i) ~= 'UNREAD' & i < args
i = i + 1
END
IF UPPER(arg.i) = 'UNREAD' THEN DO
args = args - 1
DO i = i TO args
t = i + 1
arg.i = arg.t
END
checkUnread = 1
END
END
END
IF args > 1 THEN DO
rcn = 10
moan = 'Bad usage.'
END
ELSE DO
FOLDERINFO STEM folder.
homeFolder = folder.name
IF args THEN testFolder = arg.1
ELSE testFolder = homeFolder
OPTIONS FAILAT 11
'FOLDERINFO STEM folder. 'testFolder''
rcn = rc
OPTIONS FAILAT 10
IF rcn ~= 0 THEN moan = 'Could not get information for ' || testFolder || '. Folder not found.'
ELSE DO
testFolder = folder.name
IF testFolder = spamFolder THEN DO
rcn = 10
moan = 'Source and destination must be different.'
END
ELSE DO
todo = folder.new
IF checkUnread THEN todo = folder.unread
IF checkAll THEN todo = folder.total
IF todo = 0 THEN DO
moan = 'No'
IF ~checkAll & ~checkUnread THEN moan = moan || ' new'
IF ~checkAll & checkUnread THEN moan = moan || ' unread'
moan = moan || ' messages to check in '||testFolder||'.'
END
ELSE DO
IF verbose & ~silent THEN SAY 'Embed rules...'
/****************************************************************/
/* Embed rules here, or put them in keeplist and loselist files */
/* Let through mails specifically about this program */
CALL keep_rule "Subject: SpamFryer"
CALL keep_rule "Subject: Spam Frier" /* Allow various spellings */
CALL keep_rule "Subject: Spam Fryer"
/* These three rules catch a lot of spam */
CALL lose_rule "Subject: *SPAM*" /* Premarked by mail server */
CALL lose_rule "To: www." /* Idiot mailing web server */
CALL lose_rule "To: undisclosed-recipients" /* A spam indicator */
/* These all signify a HTML mail with no plain text - i.e. spam */
CALL lose_rule "Early-Ref: </"
CALL lose_rule "Early-Ref: <HTML>"
CALL lose_rule "Early-Ref: text/html"
/****************************************************************/
DO type = keep TO lose
IF list.type ~='' THEN DO
IF ~OPEN(list,list.type,'R') THEN moan = list.type 'not found.'
ELSE DO
IF verbose & ~silent THEN SAY list.type || '...'
iterations = 0
counter = 0
DO WHILE ~EOF(list)
iterations = iterations + 1
listerror = 0
CALL learn_rule READLN(list), type
IF listerror THEN DO
sigh = 'Error in' list.type || '. Line' iterations 'skipped.'
SAY sigh
'REQUEST "'sigh'" "_Ok"'
END
END
CALL CLOSE(list)
IF counter = 0 THEN moan = list.type 'not loaded.'
ELSE moan = list.type 'loaded.'
END
IF verbose THEN SAY moan
END
END
IF verbose THEN SAY 'Filtering ' || testFolder || '...'
'SETFOLDER 'testFolder''
checked = 0
zapped = 0
DO n = 1 TO folder.total WHILE checked < todo & rcn = 0
SETMAIL folder.total-n
MAILINFO STEM mail.
IF checkAll | mail.status = 'N' | (checkUnread & mail.status = 'U') THEN DO
checked = checked + 1
dating = 0
bad = 0
good = 0
body = 0
IF ~OPEN(mail,mail.filename,'R') THEN DO
moan = 'Could not get information for ' || mail.filename || '. File not found.'
SAY moan
'REQUEST "'moan'" "_Ok|_Abort"'
IF RESULT = 0 THEN rcn = 10
END
ELSE DO
DO WHILE ~EOF(mail) & ~good & body<13
instring = READLN(mail)
inCaps = UPPER(instring)
IF body > 0 | instring = '' THEN body = body + 1
ELSE DO
IF LEFT(instring,4) = 'To: ' THEN DO
IF noDigits THEN DO i = 0 to 9
IF POS(i,instring)>0 THEN bad=1
END
DO i = 1 TO listfield.keep.gTo
IF POS(listpattern.keep.gTo.i,inCaps)>0 THEN good=1
END
DO i = 1 TO listfield.lose.gTo
IF POS(listpattern.lose.gTo.i,inCaps)>0 THEN bad=1
END
END
IF LEFT(instring,6) = 'From: ' THEN DO
DO i = 1 TO listfield.keep.gFrom
IF POS(listpattern.keep.gFrom.i,inCaps)>0 THEN good=1
END
DO i = 1 TO listfield.lose.gFrom
IF POS(listpattern.lose.gFrom.i,inCaps)>0 THEN bad=1
END
END
IF LEFT(instring,10) = 'Reply-To: ' THEN DO
DO i = 1 TO listfield.keep.gReply
IF POS(listpattern.keep.gReply.i,inCaps)>0 THEN good=1
END
DO i = 1 TO listfield.lose.gReply
IF POS(listpattern.lose.gReply.i,inCaps)>0 THEN bad=1
END
END
IF LEFT(instring,9) = 'Subject: ' THEN DO
DO i = 1 TO listfield.keep.gSubject
IF POS(listpattern.keep.gSubject.i,inCaps)>0 THEN good=1
END
DO i = 1 TO listfield.lose.gSubject
IF POS(listpattern.lose.gSubject.i,inCaps)>0 THEN bad=1
END
END
END
IF POS(' DATING ',inCaps)>0 THEN dating = dating + 1;
IF POS('CREATED BY WOMEN',inCaps)>0 THEN dating = dating + 1
DO i = 1 to listfield.keep.gEarly
IF POS(listpattern.keep.gEarly.i,inCaps)>0 THEN good=1
END
DO i = 1 to listfield.lose.gEarly
IF POS(listpattern.lose.gEarly.i,inCaps)>0 THEN bad=1
END
END
CALL CLOSE(mail)
END
IF ~good & (bad | dating>1) THEN DO
LISTSELECT NONE
LISTSELECT folder.total-n
'MAILMOVE 'spamFolder''
zapped = zapped + 1
END
END
END
moan = 'Moved' zapped 'out of' checked
IF ~checkAll & ~checkUnread THEN moan = moan || ' new'
IF ~checkAll & checkUnread THEN moan = moan || ' unread'
moan = moan || ' message'
IF todo ~= 1 THEN moan = moan || 's'
moan = moan || '.'
IF testFolder = homeFolder THEN DO
IF UPPER(LEFT(refresh,1)) ~= 'N' THEN MAILUPDATE
END
ELSE DO
'SETFOLDER 'homeFolder''
END
END
END
END
END
END
IF verbose + rcn > 0 THEN DO
SAY moan
'REQUEST "'moan'" "_Ok"'
END
END
EXIT rcn
keep_rule:
listerror = 0
CALL learn_rule arg(1), keep
IF listerror THEN DO
sigh = 'Rule "' arg(1) '" skipped.'
SAY sigh
'REQUEST "'sigh'" "_Ok"'
END
RETURN 1
lose_rule:
listerror = 0
CALL learn_rule arg(1), lose
IF listerror THEN DO
sigh = 'Rule "' arg(1) '" skipped.'
SAY sigh
'REQUEST "'sigh'" "_Ok"'
END
RETURN 1
learn_rule:
instring = UPPER(arg(1))
kind = arg(2)
PARSE VAR instring word instring /* separate the first word from the rest */
word = STRIP(word)
instring = STRIP(instring)
IF word = "//" THEN RETURN 1 /* Allow C++ comments in the configuration lines */
IF instring = '' THEN DO
IF word ~= '' THEN listerror = 1 /* Error if there is only one word in the string */
END
ELSE DO
field = 0
IF RIGHT(word,1) ~= ':' THEN word = word || ':'
IF word = 'TO:' THEN field = gTo
IF word = 'FROM:' THEN field = gFrom
IF word = 'REPLY-TO:' THEN field = gReply
IF word = 'SUBJECT:' THEN field = gSubject
IF word = 'EARLY-REF:' THEN field = gEarly
IF field = 0 THEN listerror = 1 /* Error, unexpected first word on line */
ELSE DO
IF RIGHT(instring,1) = "'" & LEFT(instring,1)="'" THEN instring = STRIP(instring,'B',"'")
IF RIGHT(instring,1) = '"' & LEFT(instring,1)='"' THEN instring = STRIP(instring,'B','"')
listfield.kind.field = listfield.kind.field + 1 /* count entries in each field parameter for each list */
counter = listfield.kind.field
listpattern.kind.field.counter = instring /* Store search pattern */
IF verbose & ~silent THEN DO
IF kind = keep THEN sigh = 'KEEP'
ELSE sigh = 'LOSE'
SAY sigh word instring
END
END
END
RETURN 1